# Vue 2
# filter管道
<template slot-scope="scope">
{{ scope.row.status | statusFilter }}
</template>
filters: {
statusFilter(status) {
const statusMap = {
1: "未确认",
2: "已确认",
};
return statusMap[status];
},
},
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# watch监听路由变化
watch: {
'$route.path': (newVal, oldVal) =>{
// RouteGurad(newVal)
console.log(newVal)
}
}
watch: {
$route(to, from) {
console.log(to.path)
},
},
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 监听对象变化
当对象中的值变化时,普通的监听无效。面对这种情况有两种解决方法,一重新赋值对象,二深层次监听
// store.js
state: {
isLogin: false,
admin: {
userId: '',
name: '',
email: '',
admin: '',
}
},
// 方法一 watch 深层次监听
'$store.state.admin': {
handler(value) {
if (value.userId) {
this.getMsgPerson()
}
},
immediate: true,
deep: true
}
// 方法二 重新赋值对象
mutations: {
login(state, payload) {
state.admin = payload // 重新赋值对象,只改变值则无法监听
/* state.admin.userId = payload.userId
state.admin.name = payload.name
state.admin.email = payload.email
state.admin.admin = payload.admin */
state.isLogin = true
},
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# computed计算属性
const fullName1 = computed(()=>{
return user.firstName + '_' + user.lastName
})
const fullName2 = computed({
get(){
return user.firstName + '_' + user.lastName
},
set(val:string){
const names = val.split('_')
user.firstName = names[0]
user.lastName = names[1]
}
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 页面刷新优解
https://blog.csdn.net/weixin_43885417/article/details/91310674
## App.vue 写入
<template>
<div id="app">
<router-view></router-view>
</div>
</template>
<script>
export default {
name: 'App',
provide() {
//父组件中通过provide来提供变量,在子组件中通过inject来注入变量。
return {
reload: this.reload,
}
},
data() {
return {
isRouterAlive: true, //控制视图是否显示的变量
}
},
methods: {
reload() {
this.isRouterAlive = false //先关闭,
this.$nextTick(function () {
this.isRouterAlive = true //再打开
})
},
},
}
</script>
// 页面刷新
this.reload();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 获取滚动条到底部距离
onMounted(() => {
window.onscroll = function () {
//变量scrollTop是滚动条滚动时,距离顶部的距离
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop
//变量windowHeight是可视区的高度
var windowHeight =
document.documentElement.clientHeight || document.body.clientHeight
//变量scrollHeight是滚动条的总高度
var scrollHeight =
document.documentElement.scrollHeight || document.body.scrollHeight
//滚动条到底部的条件
if (scrollTop + windowHeight == scrollHeight) {
//写后台加载数据的函数
console.log(
'距顶部' +
scrollTop +
'可视区高度' +
windowHeight +
'滚动条总高度' +
scrollHeight
)
}
}
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 深度选择器
:deep(.class){...}
::v-deep .class{...}
1
2
3
2
3
# 组件通讯
# 从Vue3过渡
# Vue 3
# watch监听
//方法一 监视---监视指定的数据
watch(user,({firstName,lastName}) => {
fullName3.value = firstName + '_' + lastName
},{immediate:true,deep:true})
// 方法二 监视,不需要配置immediate,本身默认就会进行监视,(默认会执行一次)
watchEffect(()=>{
fullName3.value = user.firstName + '_' + user.lastName
})
// 可监视多个数据
watch([user.firstName,user.lastName,fullName],()=>{
...
})
// 监视非响应式数据
watch([()=>user.firstName,()=>user.lastName,fullName3],()=>{
console.log('====')
})
// 监听路由
watch(
() => proxy.$route.path,(n,o) => {
state.activeIndex = n
console.log('监听到变化' + state.activeIndex)
}
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# ref、reactive区别
reactive
reactive
适用于复杂对象或数组,并且在模版中需要通过解构或访问属性来使用。ref
ref
适用于包装原始数据类型或单一的值,可以在模版中直接使用,且支持特定属性的监听和直接对象替换。// 定义 const count = ref(0) // 变化 count.value = 1
1
2
3
4
# 实践
# 解决重复点击相同导航报错
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
//获取原型对象上的push函数
const originalPush = VueRouter.prototype.push
//修改原型对象中的push方法
VueRouter.prototype.push = function push(location) {
return originalPush.call(this, location).catch(err => err)
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# axios封装
import axios, { AxiosRequestConfig, AxiosResponse } from 'axios';
import { ElLoading } from 'element-plus';
let loading: any;
const startLoading = () => {
interface Options {
lock: boolean;
text: string;
background: string;
};
const options: Options = {
lock: true,
text: "加载中...",
background: 'rgba(0,0,0,0.7)'
}
loading = ElLoading.service(options);
}
const endLoading = () => {
loading.close();
}
// 请求拦截
axios.interceptors.request.use((config: AxiosRequestConfig) => {
// 加载
startLoading();
return config;
})
// 响应拦截
axios.interceptors.response.use((response: AxiosResponse<any>) => {
// 结束loading
endLoading();
return response;
}, error => {
// 结束loading
endLoading();
// 错误提醒
return Promise.reject(error);
})
export default axios;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# 列表滚动组件
<template>
<div class="scroll-view" ref="scrollView" @mouseenter="enter" @mouseleave="leave">
<slot />
</div>
</template>
<script>
export default {
name: 'scrollView',
props: {
autoPlay: { // 自动滚动
type: Boolean,
default: () => true
}
},
data() {
return {
}
},
mounted() {
if(this.autoPlay){
this.autoScroll()
}
},
methods: {
// 鼠标移入
enter() {
clearInterval(this.scrollTimer)
this.scrollTimer = null
},
// 鼠标移出
leave() {
this.autoScroll()
},
// 自动滚动
autoScroll() {
// 加个停顿,优化体验感
setTimeout(() => {
// 防止鼠标多次移出,计时器累加
clearInterval(this.scrollTimer)
this.scrollTimer = null
this.scrollTimer = setInterval(() => {
// 获取节点
const scrollView = this.$refs['scrollView']
this.scrollHeight = scrollView.scrollHeight - scrollView.clientHeight
// 判断是否到达底部
if (scrollView.scrollTop >= this.scrollHeight) {
clearInterval(this.scrollTimer)
console.log("触底")
// 加个停顿,优化体验感
setTimeout(() => {
// 触底回调
this.$emit('scrollEnd')
}, 400)
} else {
scrollView.scrollTop = scrollView.scrollTop + 1
}
}, 50)
}, 400)
},
// 回到顶部
backTop() {
const scrollView = this.$refs['scrollView']
scrollView.scrollTop = 0
},
start() {
this.autoScroll()
}
}
}
</script>
<style lang="scss" scoped>
.scroll-view {
overflow: auto;
overflow-x: hidden;
&::-webkit-scrollbar {
width: 10px;
}
&::-webkit-scrollbar-thumb {
background: #0e0343; // 滑块颜色
border-radius: 5px; // 滑块圆角
}
// &::-webkit-scrollbar-thumb:hover {
// background: #091c71;
// }
// &::-webkit-scrollbar-track {
// border-radius: 10px; // 轨道圆角
// background-color: #1890ff // 轨道颜色
// }
}
</style>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
使用
<template>
<scroll-view class="cas-sf--inner" :autoPlay="false" @scrollEnd="scrollEnd" ref="scrollView">
</scroll-view>
</template>
<script>
...
// 调用
this.$refs['scrollView'].start()
<script/>
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# vue自定义组件点击无效
原因:vue官方文档,得知click事件作用于组件内部,如果组件内没有写click事件,便会无响应。
方法1
@click.native
1
方法2
组件内定义:
@click = '_click'
methods:
_click(){
this.$emit('click')
}
1
2
3
4
5
6
7
2
3
4
5
6
7
# Vue-Router
# 分类
全局路由守卫
- beforeEach 前置路由,常用于登录校验。
- beforeResolve 解析守卫,在 beforeEach 和 组件内beforeRouteEnter 之后,afterEach之前调用。
- afterEach 后置钩子,
路由独享守卫
beforeEnter
组件守卫
- beforeRouteEnter
- beforeRouteUpdate
- beforeRouteLeave